/*
 * @Date: 2025-09-17 18:32:49
 * @LastEditors: lixu lixu@puchigames.com
 * @LastEditTime: 2025-09-17 18:33:58
 * @FilePath: /go-helper/utils/ver.go
 * @Description:版本号工具函数
 */

package ixUtils

import (
	"strconv"
	"strings"
)

// CompareVersion 比较版本号大小
// 返回值：1表示v1>v2，-1表示v1<v2，0表示v1=v2
// 支持格式：1.2.3、v1.2.3、1.2.3-alpha、1.2.3.4等
func CompareVersion(v1, v2 string) int {
	// 清理版本号前缀
	v1 = cleanVersion(v1)
	v2 = cleanVersion(v2)

	// 分割版本号
	parts1 := splitVersion(v1)
	parts2 := splitVersion(v2)

	// 获取最大长度
	maxLen := len(parts1)
	if len(parts2) > maxLen {
		maxLen = len(parts2)
	}

	// 逐段比较
	for i := 0; i < maxLen; i++ {
		var p1, p2 int

		// 获取第i段的数值
		if i < len(parts1) {
			p1 = parseVersionPart(parts1[i])
		}
		if i < len(parts2) {
			p2 = parseVersionPart(parts2[i])
		}

		// 比较当前段
		if p1 > p2 {
			return 1
		} else if p1 < p2 {
			return -1
		}
	}

	return 0
}

// cleanVersion 清理版本号，去除前缀和后缀
func cleanVersion(version string) string {
	// 去除v前缀
	if strings.HasPrefix(version, "v") || strings.HasPrefix(version, "V") {
		version = version[1:]
	}

	// 去除后缀（如-alpha, -beta, -rc1等）
	if idx := strings.Index(version, "-"); idx != -1 {
		version = version[:idx]
	}
	if idx := strings.Index(version, "+"); idx != -1 {
		version = version[:idx]
	}

	return strings.TrimSpace(version)
}

// splitVersion 分割版本号
func splitVersion(version string) []string {
	return strings.Split(version, ".")
}

// parseVersionPart 解析版本号段为数字
func parseVersionPart(part string) int {
	// 去除非数字字符
	numStr := ""
	for _, r := range part {
		if r >= '0' && r <= '9' {
			numStr += string(r)
		} else {
			break
		}
	}

	if numStr == "" {
		return 0
	}

	num, err := strconv.Atoi(numStr)
	if err != nil {
		return 0
	}

	return num
}
